<?php

class AdmFrmWorkflow extends TPage {
//<editor-fold defaultstate="collapsed" desc="Constantes">
  const SESION_DATOS = "arr";
  //funciones pagina
  const FUNCION_VER = "Ver";
  const FUNCION_EDITAR = "Editar";
  const FUNCION_CREAR = "Crear";
  const FUNCION_ELIMINAR = "Eliminar";
  //indices arreglo
  const ARRAY_DETALLE = 0;
  const ARRAY_ENCARGADOS_NO_PERTENECEN = 1;
  const ARRAY_ENCARGADOS_PERTENECEN = 2;
  const ARRAY_ENCARGADOS_PERMISOS = 3;

//</editor-fold>

//<editor-fold defaultstate="collapsed" desc="Metodos Privados">
  /**
   * obtiene los registros desde la base de datos
   * @author VSR, 27/11/2011
   */
  private function obtenerDatos($idWorkflow){
    try {
      $nombrePagina = Utilidades::obtenerNombrePaginaActual($this);
      $arr = WfWorkflow::obtenerDetalle($idWorkflow);
      Utilidades::grabarSessionPorNombre(self::SESION_DATOS.$nombrePagina, $arr);
    } catch (Exception $e) {
      throw new Exception($e->getMessage());
    }
  }

  /**
   * actualiza los controles de la pagina segun los datos obtenidos
   * @author VSR, 01/01/2011
   */
  private function actualizaInterfaz(){
    $totalRegistros = 0;
    try {
      $nombrePagina = Utilidades::obtenerNombrePaginaActual($this);
      $oUsuario = Utilidades::obtenerSessionPorNombre(Usuario::NOMBRE_ENTIDAD);
      $arr = Utilidades::obtenerSessionPorNombre(self::SESION_DATOS.$nombrePagina);

      //inicializa controles en vacio
      $idEmpresa = $this->txtIdEmpresa->Value;
      $nombre = "";
      $activo = 0;
      $idWorkflow = "0";
      $idPlantilla = "0";
      $descripcion = "";
      $valorPlazoTotal = 0;
      $unidadMedidaPlazoTotal = "";
      $fechaInicio = "";
      $fechaTermino = "";
      $puedeMoverPasos = 0;
      $totalFlujos = "0";

      if(!is_null($arr)) {
        $arrDetalle = $arr[self::ARRAY_DETALLE];
        $totalRegistros = count($arrDetalle);
        if($totalRegistros > 0) {
          $row = $arrDetalle[0];
          $idWorkflow = $row["IdWorkflow"];
          $idPlantilla = $row["IdPlantilla"];
          $nombre = $row["Nombre"];
          $descripcion = $row["Descripcion"];
          $activo = $row["Activo"];
          $valorPlazoTotal = $row["ValorPlazoTotal"];
          $unidadMedidaPlazoTotal = $row["UnidadMedidaPlazoTotal"];
          $fechaInicio = $row["FechaInicio"];
          $fechaTermino = $row["FechaTermino"];
          $puedeMoverPasos = $row["PuedeMoverPasos"];
          $totalFlujos = $row["TotalFlujos"];
        }
      }

    } catch (Exception $e) {
      $nombre = "";
      $activo = 0;
      $idWorkflow = "0";
      $idPlantilla = "0";
      $descripcion = "";
      $valorPlazoTotal = 0;
      $unidadMedidaPlazoTotal = "";
      $fechaInicio = "";
      $fechaTermino = "";
      $puedeMoverPasos = 0;
      $totalFlujos = "0";
    }

    //asigna valores
    $this->txtNombre->Text = $nombre;
    $this->chkActivo->Checked = ($idWorkflow == "0") ? true : ( ($activo == 1) ? true : false );
    $this->lblTituloFormulario->Text = ( ($idWorkflow == "0") ? "Nuevo" : "Modificar" )." Workflow";
    $this->ddlEmpresa->asignarSelectedValue($idEmpresa);
    $this->ddlEmpresa->Enabled = ($idWorkflow == "0") ? true : false;
    $this->txtDescripcion->Text = $descripcion;
    $this->txtTotalPlazoAprobacion->Text = ($valorPlazoTotal == 0) ? "" : $valorPlazoTotal;
    $this->txtUnidadTotalPlazoAprobacion->Value = $unidadMedidaPlazoTotal;
    $this->txtTotalFlujos->Value = $totalFlujos;
    $this->txtFechaInicio->Text = $fechaInicio;
    $this->txtFechaTermino->Text = $fechaTermino;
    $this->chkPuedeMoverPasos->Checked = ($idWorkflow == "0") ? false : ( ($puedeMoverPasos == 1) ? true : false );

    //obtiene los check de los permisos
    $strListadoCheck = $this->obtenerListadoCheckPermisos($arr[self::ARRAY_ENCARGADOS_PERMISOS]);
    $this->lblPermisosEncargados->Text = $strListadoCheck;
    $this->ddlPlantilla->Enabled = ($totalFlujos == "0") ? true : false;
    $this->txtIdPlantilla->Value = $idPlantilla;

    $script = "cargarComboPlantilla('".$idPlantilla."', 'Seleccione');";
    $this->Page->ClientScript->registerEndScript("cargarDatosEmpresa", $script);

    //actualiza el multiselect
    if(!is_null($arr) && $idWorkflow != "0") {
      $this->msEncargados->dataSourcePadre($arr[self::ARRAY_ENCARGADOS_NO_PERTENECEN]);
      $this->msEncargados->dataTextFieldPadre("Texto");
      $this->msEncargados->dataValueFieldPadre("Valor");
      $this->msEncargados->dataBindPadre();
      $this->msEncargados->dataSourceHija($arr[self::ARRAY_ENCARGADOS_PERTENECEN]);
      $this->msEncargados->dataTextFieldHija("Texto");
      $this->msEncargados->dataValueFieldHija("Valor");
      $this->msEncargados->dataBindHija();
    }
  }

  /**
   * inicializa algunos controles cuando se carga por primera vez la pagina
   * @param <type> $isPostBack
   * @author VSR, 01/01/2011
   */
  private function inicializaControles($isPostBack){
    try {
      $nombrePagina = $this->obtenerNombrePagina();
      $idWorkflow = $this->txtIdWorkflow->Value;
      $estado = Utilidades::isNull(Utilidades::obtenerSessionPorNombre("Estado".$nombrePagina), "");
      $cargarDesdePopUp = "0";

      if($estado == "INGRESADO" || $estado == "MODIFICADO" || $estado == "ELIMINADO") {
        $cargarDesdePopUp = "1";
      }

      //agrega atributo a control
      $this->btnCrear->Attributes->Add("onclick", "return(validarFormularioWorkflow())");
      $this->btnEliminar->Attributes->Add("onclick", "return(validarEliminarWorkflow())");
      $this->btnAplicar->Attributes->Add("onclick", "return(validarFormularioWorkflow())");
      $this->btnAceptar->Attributes->Add("onclick", "return(validarFormularioWorkflow())");
      $this->btnCrearPaso->Attributes->Add("onclick", "return(validarFormularioPaso())");
      $this->chkPuedeMoverPasos->Attributes->Add("onclick", "validaPuedeMoverPasos('".$this->chkPuedeMoverPasos->ClientID."')");

      //inicializa los controles del Correlativo y Locales
      $this->inicializaControlesEventoWindowOnLoad($isPostBack);

      //verifica los permisos sobre los controles
      $this->verificarPermisos();

    } catch (Exception $e) {
      throw new Exception($e->getMessage());
    }
  }

  /**
   * inicializa los controles al cargar la pagina
   * @param <type> $isPostBack
   * @author VSR, 27/11/2011
   */
  private function inicializaControlesEventoWindowOnLoad($isPostBack) {
    $idEmpresa = $this->txtIdEmpresa->Value;
    $idWorkflow = $this->txtIdWorkflow->Value;
    $nombrePagina = $this->obtenerNombrePagina();
    $estado = Utilidades::isNull(Utilidades::obtenerSessionPorNombre("Estado".$nombrePagina), "");
    $sb = new StringBuilder();

    if($estado == "INGRESADO" || $estado == "MODIFICADO" || $estado == "") {
      $sb->appendLine("setTimeout(\"ocultarElemento('".$this->pnlMensajeUsuario->ClientID."')\", 5000);");
    }
    if($idEmpresa != "0" && $idWorkflow == "0") { $sb->appendLine("cargarDatosRelacionadosEmpresa();"); }
    $sb->appendLine("cargarAprobadores();");
    $sb->appendLine("cargarPermisosPaso();");
    $sb->appendLine("dibujarTablaPasos('$idWorkflow','".$this->lblPasos->ClientID."');");
    $sb->appendLine("calcularPlazoTotalWorkflow({recalcular:false});");
    $sb->appendLine("validaPuedeMoverPasos('".$this->chkPuedeMoverPasos->ClientID."','-1');");

    $this->Page->ClientScript->registerEndScript("windowOnLoad", $sb->toString());
  }

  /**
   * verifica los permisos sobre los controles
   * @author VSR, 01/01/2011
   */
  private function verificarPermisos(){
    $paginaActual = Utilidades::obtenerNombrePaginaActual($this);
    $idWorkflow = $this->txtIdWorkflow->Value;
    //verifica los permisos para los controles
    $this->pnlContenido->Visible = Utilidades::tienePermiso($paginaActual, self::FUNCION_VER);
    $this->hBotonAplicar->Visible = Utilidades::tienePermiso($paginaActual, self::FUNCION_VER) && $idWorkflow != "0" && Utilidades::tienePermiso($paginaActual, self::FUNCION_EDITAR);
    $this->hBotonAceptar->Visible = Utilidades::tienePermiso($paginaActual, self::FUNCION_VER) && $idWorkflow != "0" && Utilidades::tienePermiso($paginaActual, self::FUNCION_EDITAR);
    $this->hBotonCrear->Visible = Utilidades::tienePermiso($paginaActual, self::FUNCION_VER) && $idWorkflow == "0" && Utilidades::tienePermiso($paginaActual, self::FUNCION_CREAR);
    $this->hBotonEliminar->Visible = Utilidades::tienePermiso($paginaActual, self::FUNCION_VER) && $idWorkflow != "0" && Utilidades::tienePermiso($paginaActual, self::FUNCION_ELIMINAR);

    if(!$this->pnlContenido->Visible) {
      $this->pnlMensajeAcceso->Visible = true;
      Utilidades::setPanelMensajeUsuario($this->pnlMensajeAcceso, "No tiene permiso para ver esta p&aacute;gina", "50%", Utilidades::ESTILO_MENSAJE_ERROR);
    }
  }

  /**
   * muestra mensaje al usuario
   * @author VSR, 27/11/2011
   */
  private function mostrarMensajeUsuario(){
    try {
      $mensaje = Utilidades::isNull(Utilidades::obtenerSessionPorNombre("msg"),"");
      $baseUrl = $this->Page->Theme->BaseUrl;

      //asigna mensaje al panel
      $this->pnlMensajeUsuario->Visible = true;

      //dependiendo de la marca especial que tenga el sistema es como se muestra el mensaje al usuario
      if(strpos($mensaje, "{#INGRESADO}") === 0) {
        $mensaje = str_replace("{#INGRESADO}", "", $mensaje);
        Utilidades::setPanelMensajeUsuarioConBotonCerrar($this->pnlMensajeUsuario, $mensaje, "100%", Utilidades::ESTILO_MENSAJE_EXITO, $baseUrl);
      } elseif (strpos($mensaje, "{#MODIFICADO}") === 0) {
        $mensaje = str_replace("{#MODIFICADO}", "", $mensaje);
        Utilidades::setPanelMensajeUsuarioConBotonCerrar($this->pnlMensajeUsuario, $mensaje, "100%", Utilidades::ESTILO_MENSAJE_EXITO, $baseUrl);
      } elseif (strpos($mensaje, "{#ELIMINADO}") === 0) {
        $mensaje = str_replace("{#ELIMINADO}", "", $mensaje);
        Utilidades::setPanelMensajeUsuarioConBotonCerrar($this->pnlMensajeUsuario, $mensaje, "100%", Utilidades::ESTILO_MENSAJE_EXITO, $baseUrl);
      } elseif (strpos($mensaje, "{#DUPLICADO}") === 0) {
        $mensaje = str_replace("{#DUPLICADO}", "", $mensaje);
        Utilidades::setPanelMensajeUsuario($this->pnlMensajeUsuario, $mensaje, "100%", Utilidades::ESTILO_MENSAJE_ERROR);
      } elseif (strpos($mensaje, "{#ERROR}") === 0) {
        $mensaje = str_replace("{#ERROR}", "", $mensaje);
        Utilidades::setPanelMensajeUsuario($this->pnlMensajeUsuario, $mensaje, "100%", Utilidades::ESTILO_MENSAJE_ERROR);
      } else {
        $this->pnlMensajeUsuario->Visible = false;
      }
      Utilidades::grabarSessionPorNombre("msg", "");
    } catch (Exception $e) {
      $this->pnlMensajeUsuario->Visible = false;
    }

  }

  /**
   * obtiene nombre de la pagina actual
   * @return <type>
   * @author VSR, 27/11/2011
   */
  private function obtenerNombrePagina(){
    $nombrePagina = Utilidades::obtenerNombrePaginaActual($this);
    return $nombrePagina;
  }

  /**
   * graba los datos del workflow
   * @author VSR, 27/11/2011
   */
  private function grabarWorkflow($accion) {
    try {
      $nombrePagina = Utilidades::obtenerNombrePaginaActual($this);
      $idWorkflow = $this->txtIdWorkflow->Value;
      $idEmpresa = $this->ddlEmpresa->obtenerSelectedValue();
      $cargarFiltrosSesion = $this->txtCargarFiltrosSesion->Value;
      $status = "";
      $textoMensaje = "";
      $grabadoConExito = true;
      $queryStringPagina = "";

      //grabar valores
      $textoMensaje .= $this->grabarDatosWorkflow($status, $idWorkflow);

      if ($textoMensaje != "") {
        $grabadoConExito = false;
      } else {
        $grabadoConExito = true;
      }

      //muestra mensaje dependiendo si se grabo o no
      if ($grabadoConExito) {
        switch ($status) {
          case "ingresado":
            $textoMensaje = "{#INGRESADO}El workflow fue ingresado satisfactoriamente.<br />";
            Utilidades::grabarSessionPorNombre("Estado".$nombrePagina, "INGRESADO");
            break;
          case "modificado":
            $textoMensaje = "{#MODIFICADO}El workflow fue actualizado satisfactoriamente.<br />";
            Utilidades::grabarSessionPorNombre("Estado".$nombrePagina, "MODIFICADO");
            break;
          case "duplicado":
            $textoMensaje = "{#DUPLICADO}El workflow ya existe. Ingrese otro por favor.<br />";
            Utilidades::grabarSessionPorNombre("Estado".$nombrePagina, "DUPLICADO");
            break;
          case "error":
            $textoMensaje = "{#ERROR}Se produjo un error interno y no se pudo ingresar el workflow. Intente nuevamente por favor.<br />";
            Utilidades::grabarSessionPorNombre("Estado".$nombrePagina, "ERROR");
            break;
          default:
            break;
        }
      } else {
        $textoMensaje = "{#ERROR}".$textoMensaje;
        Utilidades::grabarSessionPorNombre("Estado".$nombrePagina, "ERROR");
      }

      //construye queryString
      $queryString = "{";
      $queryString .= " \"IdWorkflow\":\"".$idWorkflow."\"";
      $queryString .= ",\"IdEmpresa\":\"".$idEmpresa."\"";
      $queryString .= ",\"CargarFiltrosSesion\":\"".$cargarFiltrosSesion."\"";
      $queryString .= "}";
      $queryString = Criptografia::encriptarURL($queryString);

      if (($status == "ingresado" || $status == "modificado") && $accion == Sistema::ACEPTAR ) {
        $cargarFiltrosSesion = $this->txtCargarFiltrosSesion->Value;
        Utilidades::grabarSessionPorNombre(Utilidades::SESION_CARGAR_FILTROS_SESION, $cargarFiltrosSesion);
        $this->Response->redirect($this->Service->constructUrl("Workflow.AdmListWorkflow"));
      } else {
        Utilidades::grabarSessionPorNombre("msg", $textoMensaje);
        //construye query string con los valores correspondientes
        $this->Response->redirect("index.php?page=".$nombrePagina."&a=".$queryString);
      }

    } catch (Exception $e) {
      throw new Exception($e->getMessage());
    }
  }

  /**
   * graba o actualiza el workflow
   * @param <type> $status
   * @param <type> $idWorkflow
   * @return string
   * @author VSR, 27/11/2011
   */
  private function grabarDatosWorkflow(&$status, &$idWorkflow) {
    $msgError = "";
    $listadoPermisosEncargados = "";

    try {
      $oUsuario = Utilidades::obtenerSessionPorNombre(Usuario::NOMBRE_ENTIDAD);
      $nombre = Utilidades::isNull($this->txtNombre->Text, "");
      $activo = ($this->chkActivo->Checked) ? "1" : "0";
      $idEmpresa = ($idWorkflow == "0") ? $this->ddlEmpresa->obtenerSelectedValue() : $this->txtIdEmpresa->Value;
      $idPlantilla = ($this->ddlPlantilla->Enabled) ? $this->Request[$this->ddlPlantilla->UniqueID] : $this->txtIdPlantilla->Value;
      $listadoIdEncargados = $this->msEncargados->valueListadoId();
      $arrPermisosEncargados = $this->Request["chkPermisoEncargado"];
      $observacion = $this->txtDescripcion->Text;
      $valorPlazoTotal = $this->txtTotalPlazoAprobacion->Text;
      $unidadMedidaPlazoTotal = $this->txtUnidadTotalPlazoAprobacion->Value;
      $fechaInicio = $this->txtFechaInicio->Text;
      $fechaTermino = $this->txtFechaTermino->Text;
      $puedeMoverPasos = ($this->chkPuedeMoverPasos->Checked) ? "1" : "0";

      $idUsuario = $oUsuario->getId();
      if(!Utilidades::isNullOrEmpty($arrPermisosEncargados)){ $listadoPermisosEncargados = implode(",", $arrPermisosEncargados); }
      $arr = WfWorkflow::grabarDatos($idWorkflow, $nombre, $idEmpresa, $idPlantilla, $activo, $listadoIdEncargados, $observacion, $idUsuario, $listadoPermisosEncargados,
                                     $valorPlazoTotal, $unidadMedidaPlazoTotal, $fechaInicio, $fechaTermino, $puedeMoverPasos);

      if(is_null($arr)){
        throw new Exception("Error al ejecutar WfWorkflow->grabarDatosWorkflow()");
      } else {
        $idWorkflow = $arr[0]["IdWorkflow"];
        $status = $arr[0]["Status"];
        if ($status == "duplicado") { 
          $idWorkflow = "0";
        } else {
          $this->grabarPasos($idWorkflow);
        }
      }
    } catch (Exception $e) {
      $msgError = "Se produjo un error interno, no se pudo grabar el workflow.<br/>";
      $idWorkflow = ($idWorkflow > 0) ? $idWorkflow : "0";
      $status = "error";
    }
    return $msgError;
  }

  /**
   * graba los pasos del workflow
   * @param <type> $idWorkflow 
   * @author VSR, 30/11/2011
   */
  private function grabarPasos($idWorkflow){
    $arrIndicePaso = $this->Request["txtIndicePaso"];
    $boolHayCambios = false;

    try {
      if (!is_null($arrIndicePaso)) {
        //obtiene la estructura de los pasos actualmente
        $arr = WfWorkflow::obtenerEstructuraPasosActuales($idWorkflow);

        //obtiene los valores del request
        $arrIdPaso = $this->Request["txtIdPaso"];
        $arrOrdenPaso = $this->Request["txtOrdenPaso"];
        $arrNombrePaso = $this->Request["txtNombrePaso"];
        $arrAprobadores = $this->Request["txtAprobadores"];
        $arrValorPlazo = $this->Request["txtValorPlazo"];
        $arrUnidadMedida = $this->Request["txtUnidadMedida"];
        $arrValorSemaforoAmarillo = $this->Request["txtValorSemaforoAmarillo"];
        $arrUnidadMedidaSemaforoAmarillo = $this->Request["txtUnidadMedidaSemaforoAmarillo"];

        //-------------------------------------------------
        //elimina las funciones que no existen. enviar "listadoIdFuncion"
        $listadoIdPaso = implode(",", $arrIdPaso);
        $status = WfWorkflow::eliminarPasosNoExistentes($idWorkflow, $listadoIdPaso);
        if ($status == Sistema::CODIGO_SQL_ERROR) {
          throw new Exception("No se pudo eliminar las funciones de la pagina");
        }

        //verifica si se hicieron cambios con respecto a lo que existe en base de datos actualmente
        if(!$boolHayCambios){
          $boolHayCambios = $this->validarCambiosPasos($arr, $arrIdPaso, $arrNombrePaso, $arrValorPlazo, $arrUnidadMedida, $arrValorSemaforoAmarillo, $arrUnidadMedidaSemaforoAmarillo);
        }

        //-------------------------------------------------
        //guarda o actualiza los pasos
        $status = "";
        $totalRegistros = count($arrIndicePaso);
        for ($i = 0; $i <= $totalRegistros - 1; $i++) {
          $intIndicePaso = urlDecode($arrIndicePaso[$i]);
          $intIdPaso = urlDecode($arrIdPaso[$i]);
          $intOrdenPaso = urlDecode($arrOrdenPaso[$i]);
          $strNombrePaso = utf8_decode(urlDecode($arrNombrePaso[$i]));
          $strAprobadores = urlDecode($arrAprobadores[$i]);
          $intValorPlazo = urlDecode($arrValorPlazo[$i]);
          $strUnidadMedida = urlDecode($arrUnidadMedida[$i]);
          $intValorSemaforoAmarillo = urlDecode($arrValorSemaforoAmarillo[$i]);
          $strUnidadMedidaSemaforoAmarillo = urlDecode($arrUnidadMedidaSemaforoAmarillo[$i]);
          $arrCheckPermisos = $this->Request["chkPermiso_".$intIndicePaso];

          //verifica si se hicieron cambios con respecto a lo que existe en base de datos actualmente
          if(!$boolHayCambios){
            $boolHayCambios = $this->validarCambiosDentroPasos($arr, $intIdPaso, $arrCheckPermisos);
          }

          if (is_null($arrCheckPermisos)) {
            $srtPermisos = "";
          } else {
            $srtPermisos = implode(",", $arrCheckPermisos);
          }

          //graba los pasos
          $status = WfWorkflow::grabarPaso($idWorkflow, $intIdPaso, $strNombrePaso, $intOrdenPaso, $intValorPlazo, $strUnidadMedida, $strAprobadores, $srtPermisos, $intValorSemaforoAmarillo, $strUnidadMedidaSemaforoAmarillo);
          if ($status == Sistema::CODIGO_SQL_ERROR) {
            throw new Exception("No se pudo grabar el paso");
          }
        }

        //si hay cambios entonces se graba cache
        if($boolHayCambios){
          $status = WfWorkflow::grabarCache($idWorkflow);
          if ($status == Sistema::CODIGO_SQL_ERROR) {
            throw new Exception("No se pudo grabar el cache");
          }
        }

        //elimina los cache no utilizados
        $status = WfWorkflow::eliminarCacheNoReferenciados();
        if ($status == Sistema::CODIGO_SQL_ERROR) {
          throw new Exception("No se pudo eliminar el cache");
        }
      }

    } catch (Exception $e) {
      throw new Exception($e->getMessage());
    }

  }

  /**
   * elimina los datos del workflow
   * @param <type> $status
   * @param <type> $idWorkflow
   * @return string
   * @author VSR, 07/01/2012
   */
  private function eliminarWorkflow(&$status, $idWorkflow, $idUsuario) {
    $msgError = "";

    try {
      //se deja funcion para eliminar fisicamente los registros
      //$status = WfWorkflow::eliminarDatos($idWorkflow);
      $status = WfWorkflow::eliminacionLogica($idWorkflow, $idUsuario);
    } catch (Exception $e) {
      $msgError = "Se produjo un error interno, no se pudo eliminar el wokkflow.<br/>".$e->getMessage();
    }
    //retorna valor
    return $msgError;
  }

  /**
   * valida cambios en los array de IdPaso, NombrePaso, ValorPlazo, UnidadMedidaPlazo
   * @param <type> $arr
   * @param <type> $arrIdPaso
   * @param <type> $arrNombrePaso
   * @param <type> $arrValorPlazo
   * @param <type> $arrUnidadMedida
   * @return boolean
   * @author VSR, 06/01/2012
   */
  private function validarCambiosPasos($arr, $arrIdPaso, $arrNombrePaso, $arrValorPlazo, $arrUnidadMedida, $arrValorSemaforoAmarillo, $arrUnidadMedidaSemaforoAmarillo){
    $boolHayCambios = false;
    $ARR_ID_PASOS = 0;
    $ARR_NOMBRE_PASOS = 1;
    $ARR_VALOR_PLAZO = 2;
    $ARR_UNIDAD_MEDIDA_PLAZO = 3;
    $ARR_VALOR_SEMAFORO_AMARILLO = 6;
    $ARR_UNIDAD_MEDIDA_SEMAFORO_AMARILLO = 7;

    try {
      //verifica IdPaso
      if(!$boolHayCambios){
        $arrIdPasoActual = $arr[$ARR_ID_PASOS];
        $valor = $arrIdPasoActual[0]["IdPaso"];
        $arrIdPasoActual = explode("|", $valor);
        $boolHayCambios = !Utilidades::compararArray($arrIdPasoActual, $arrIdPaso);
      }

      //verifica Nombre Paso
      if(!$boolHayCambios){
        $arrNombrePasoActual = $arr[$ARR_NOMBRE_PASOS];
        $valor = $arrNombrePasoActual[0]["NombrePaso"];
        $arrNombrePasoActual = explode("|", $valor);
        $arrNombrePaso = Utilidades::urlencodeArray($arrNombrePaso, Utilidades::ARRAY_URL_DECODE);
        $boolHayCambios = !Utilidades::compararArray($arrIdPasoActual, $arrIdPaso);
      }

      //verifica Valor Plazo
      if(!$boolHayCambios){
        $arrValorPlazoActual = $arr[$ARR_VALOR_PLAZO];
        $valor = $arrValorPlazoActual[0]["ValorPlazo"];
        $arrValorPlazoActual = explode("|", $valor);
        $boolHayCambios = !Utilidades::compararArray($arrValorPlazoActual, $arrValorPlazo);
      }

      //verifica Unidad Medida Plazo
      if(!$boolHayCambios){
        $arrUnidadMedidaPlazoActual = $arr[$ARR_UNIDAD_MEDIDA_PLAZO];
        $valor = $arrUnidadMedidaPlazoActual[0]["UnidadMedidaPlazo"];
        $arrUnidadMedidaPlazoActual = explode("|", $valor);
        $boolHayCambios = !Utilidades::compararArray($arrUnidadMedidaPlazoActual, $arrUnidadMedida);
      }

      //verifica Valor Semaforo Amarillo
      if(!$boolHayCambios){
        $arrValorSemaforoAmarilloActual = $arr[$ARR_VALOR_SEMAFORO_AMARILLO];
        $valor = $arrValorSemaforoAmarilloActual[0]["ValorSemaforoAmarillo"];
        $arrValorSemaforoAmarilloActual = explode("|", $valor);
        $boolHayCambios = !Utilidades::compararArray($arrValorSemaforoAmarilloActual, $arrValorSemaforoAmarillo);
      }

      //verifica Unidad Medida Semaforo Amarillo
      if(!$boolHayCambios){
        $arrUnidadMedidaSemafotoAmarilloActual = $arr[$ARR_UNIDAD_MEDIDA_SEMAFORO_AMARILLO];
        $valor = $arrUnidadMedidaSemafotoAmarilloActual[0]["UnidadMedidaSemaforoAmarillo"];
        $arrUnidadMedidaSemafotoAmarilloActual = explode("|", $valor);
        $boolHayCambios = !Utilidades::compararArray($arrUnidadMedidaSemafotoAmarilloActual, $arrUnidadMedidaSemaforoAmarillo);
      }

    } catch (Exception $e) {
      $boolHayCambios = true;
    }
    return $boolHayCambios;
  }

  /**
   * valida cambios en dentro de los pasos: Aprobadores, Permisos
   * @param <type> $arr
   * @param <type> $idPaso
   * @param <type> $arrPermisos
   * @return boolean
   * @author VSR, 06/01/2012
   */
  private function validarCambiosDentroPasos($arr, $idPaso, $arrPermisos){
    $boolHayCambios = false;
    $ARR_PERMISOS_PASOS = 5;

    try {
      //verifica Permisos
      if(!$boolHayCambios){
        $arrPermisosActual = $arr[$ARR_PERMISOS_PASOS];
        $arrPermisosActual = Utilidades::arrayRowFilter($arrPermisosActual, "IdPaso == '".$idPaso."'");
        $totalPermisosActual = count($arrPermisosActual);
        if ($totalPermisosActual > 0) {
          $valor = $arrPermisosActual[0]["Permisos"];
          $arrPermisosActual = explode("|", $valor);
        }
        $boolHayCambios = !Utilidades::compararArray($arrPermisosActual, $arrPermisos, Utilidades::COMPARAR_ARRAY_CONTENIDO);
      }

    } catch (Exception $e) {
      $boolHayCambios = true;
    }
    return $boolHayCambios;
  }

  /**
   * obtiene el listado de check de permisos
   * @param <type> $arr
   * @param <type> $intIdPaso
   * @author VSR, 04/12/2011
   */
  private function obtenerListadoCheckPermisos($arrPermisos) {
    $strHtml = "";
    $sb = new StringBuilder();
    try {
      $totalRegistros = count($arrPermisos);
      for ($i = 0; $i <= $totalRegistros - 1; $i++) {
        $row = $arrPermisos[$i];
        $intIdPermiso = $row["IdPermiso"];
        $strNombre = $row["NombrePermiso"];
        $intSeleccionado = $row["Seleccionado"];
        $intIndice = $i + 1;

        $checked = ($intSeleccionado == 1) ? "checked" : "";
        $sb->appendLine("<input type='checkbox' id='chkPermisoEncargado_" . $intIndice . "' name='chkPermisoEncargado[]' value='" . $intIdPermiso . "' " . $checked . " />&nbsp;<label for='chkPermisoEncargado_" . $intIndice . "'>" . $strNombre . "</label><br />");
      }
      $strHtml = $sb->toString();
    } catch (Exception $e) {
      $strHtml = "";
    }
    return $strHtml;
  }

//</editor-fold>

//<editor-fold defaultstate="collapsed" desc="Eventos Controles">
  public function onLoad($param) {
    parent::onLoad($param);
    try {
      $argCrypt = $this->Request["a"];
      $textoDesencriptado = Criptografia::desencriptar($argCrypt);
      $this->txtThemeBaseUrl->Value = $this->Page->Theme->BaseUrl;

      if (!$this->Page->IsPostBack) {
        if(!Utilidades::isNullOrEmpty($textoDesencriptado)) {
          $arr = json_decode($textoDesencriptado);
          //obtiene los datos
          $idWorkflow = $arr->IdWorkflow;
          $idEmpresa = $arr->IdEmpresa;
          $cargarFiltrosSesion = $arr->CargarFiltrosSesion;
          $this->txtIdWorkflow->Value = $idWorkflow;
          $this->txtIdEmpresa->Value = $idEmpresa;
          $this->txtCargarFiltrosSesion->Value = $cargarFiltrosSesion;
          $this->pnlMensajeAcceso->Visible = false;
          $this->pnlContenido->Visible = true;
          $this->obtenerDatos($idWorkflow);
          $this->inicializaControles($this->IsPostBack);
          $this->actualizaInterfaz();
          $this->mostrarMensajeUsuario();
        } else {
          $this->hBotonCrear->Visible = false;
          $this->hBotonEliminar->Visible = false;
          $this->hBotonAplicar->Visible = false;
          $this->hBotonAceptar->Visible = false;
          $this->pnlContenido->Visible = false;
          $this->pnlMensajeAcceso->Visible = true;
          Utilidades::setPanelMensajeUsuario($this->pnlMensajeAcceso, "El argumento recibido no es v&aacute;lido", "50%", Utilidades::ESTILO_MENSAJE_ERROR);
        }
      }
    } catch (Exception $e) {
      $this->hBotonCrear->Visible = false;
      $this->hBotonEliminar->Visible = false;
      $this->hBotonAplicar->Visible = false;
      $this->hBotonAceptar->Visible = false;
      $this->pnlContenido->Visible = false;
      $this->pnlMensajeAcceso->Visible = true;
      Utilidades::setPanelMensajeUsuario($this->pnlMensajeAcceso, "El argumento recibido no es v&aacute;lido", "50%", Utilidades::ESTILO_MENSAJE_ERROR);
    }
  }

  public function btnCrearClick($sender, $param){
    $this->grabarWorkflow(Sistema::APLICAR);
  }

  public function btnAplicarClick($sender, $param){
    $this->grabarWorkflow(Sistema::APLICAR);
  }

  public function btnAceptarClick($sender, $param){
    $this->grabarWorkflow(Sistema::ACEPTAR);
  }

  public function btnVolverClick($sender, $param){
    $cargarFiltrosSesion = $this->txtCargarFiltrosSesion->Value;
    Utilidades::grabarSessionPorNombre(Utilidades::SESION_CARGAR_FILTROS_SESION, $cargarFiltrosSesion);
    $this->Response->redirect($this->Service->constructUrl("Workflow.AdmListWorkflow"));
  }

  public function btnEliminarClick($sender, $param){
    $oUsuario = Utilidades::obtenerSessionPorNombre(Usuario::NOMBRE_ENTIDAD);
    $idWorkflow = $this->txtIdWorkflow->Value;
    $idEmpresa = $this->txtIdEmpresa->Value;
    $cargarFiltrosSesion = $this->txtCargarFiltrosSesion->Value;
    $status = "";
    $textoMensaje = "";
    $eliminadoConExito = true;
    $queryString = "";

    try {
      $idUsuario = $oUsuario->getId();
      $nombrePagina = Utilidades::obtenerNombrePaginaActual($this);
      //elimina la pagina
      $textoMensaje .= $this->eliminarWorkflow($status, $idWorkflow, $idUsuario);

      if ($textoMensaje != "") {
        $eliminadoConExito = false;
      } else {
        $eliminadoConExito = true;
      }

      //muestra mensaje dependiendo si se grabo o no
      if ($eliminadoConExito) {
        switch ($status) {
          case "eliminado":
            $textoMensaje = "{#ELIMINADO}El workflow fue eliminado satisfactoriamente. Complete el formulario para ingresar uno nuevo.<br />";
            Utilidades::grabarSessionPorNombre("Estado".$nombrePagina, "ELIMINADO");
            break;
          case "error":
            $textoMensaje = "{#ERROR}Se produjo un error interno y no se pudo eliminar el workflow. Intente nuevamente por favor.<br />";
            Utilidades::grabarSessionPorNombre("Estado".$nombrePagina, "ERROR");
            break;
        }
      } else {
        $textoMensaje = "{#ERROR}".$textoMensaje;
        Utilidades::grabarSessionPorNombre("Estado".$nombrePagina, "ERROR");
      }

      //construye queryString
      $queryString = "{";
      $queryString .= " \"IdWorkflow\":\"".(($status == "eliminado") ? "0" : $idWorkflow)."\"";
      $queryString .= ",\"IdEmpresa\":\"".$idEmpresa."\"";
      $queryString .= ",\"CargarFiltrosSesion\":\"".$cargarFiltrosSesion."\"";
      $queryString .= "}";
      $queryString = Criptografia::encriptarURL($queryString);

      Utilidades::grabarSessionPorNombre("msg", $textoMensaje);
      //construye query string con los valores correspondientes
      $this->Response->redirect("index.php?page=".$nombrePagina."&a=".$queryString);
    } catch (Exception $e) {
      throw new Exception($e->getMessage());
    }
  }



//</editor-fold>

}

?>
